/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package edu.upn.sigemfi.plt.be;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
//Por SUCURSAL
import edu.upn.sigemfi.seg.be.Sucursal;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

/**
 *
 * @author Administrador
 */
@Entity
@Table(name = "PLT_CUENTA")
@NamedQueries({@NamedQuery(name = "Cuenta.findAll", query = "SELECT c FROM Cuenta c"),
@NamedQuery(name = "Cuenta.findByIdCuenta", query = "SELECT c FROM Cuenta c WHERE c.idCuenta = :idCuenta"),
@NamedQuery(name = "Cuenta.findByMontoActual", query = "SELECT c FROM Cuenta c WHERE c.montoActual = :montoActual"),
@NamedQuery(name = "Cuenta.findByFechaApertura", query = "SELECT c FROM Cuenta c WHERE c.fechaApertura = :fechaApertura"),
@NamedQuery(name = "Cuenta.findByNroCuenta", query = "SELECT c FROM Cuenta c WHERE c.nroCuenta = :nroCuenta"),
@NamedQuery(name = "Cuenta.findByEstadoCuenta", query = "SELECT c FROM Cuenta c WHERE c.estadoCuenta = :estadoCuenta"),
@NamedQuery(name = "Cuenta.findByTasaInteresPlazoFijo", query = "SELECT c FROM Cuenta c WHERE c.tasaInteresPlazoFijo = :tasaInteresPlazoFijo"),
@NamedQuery(name = "Cuenta.findByDiasPlazoFijo", query = "SELECT c FROM Cuenta c WHERE c.diasPlazoFijo = :diasPlazoFijo"),
@NamedQuery(name = "Cuenta.findByFechaFinPlazoFijo", query = "SELECT c FROM Cuenta c WHERE c.fechaFinPlazoFijo = :fechaFinPlazoFijo"),
@NamedQuery(name = "Cuenta.findByTasaItf", query = "SELECT c FROM Cuenta c WHERE c.tasaItf = :tasaItf")})
public class Cuenta implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID_CUENTA")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idCuenta;
    @Basic(optional = false)
    @Column(name = "MONTO_ACTUAL")
    private double montoActual;
    @Basic(optional = false)
    @Column(name = "FECHA_APERTURA")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaApertura;
    @Column(name = "NRO_CUENTA")
    private String nroCuenta;
    @Enumerated(EnumType.STRING)
    @Column(name = "ESTADO_CUENTA")
    private EstadoCuenta estadoCuenta;
    @Column(name = "TASA_INTERES_PLAZO_FIJO")
    private Double tasaInteresPlazoFijo;
    @Column(name = "DIAS_PLAZO_FIJO")
    private Integer diasPlazoFijo;
    @Column(name = "FECHA_FIN_PLAZO_FIJO")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaFinPlazoFijo;
    @Column(name = "TASA_ITF")
    private Double tasaItf;//para exonerarlo cambiamos la tasa a 00.00%
    @JoinColumn(name = "FID_PLT_TARJETA_DEBITO", referencedColumnName = "ID_TARJETA")
    @ManyToOne(fetch = FetchType.LAZY)
    private TarjetaDebito fidPltTarjetaDebito;
    @JoinColumn(name = "FID_PLT_TIPO_CUENTA", referencedColumnName = "ID_TIPO_CUENTA")
    @ManyToOne(fetch = FetchType.LAZY)
    private TipoCuenta fidPltTipoCuenta;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fidPltCuenta", fetch = FetchType.LAZY)
    private List<Chequera> chequeraCollection;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "cuenta", fetch = FetchType.LAZY)
    private List<DetalleCuentaCliente> detalleCuentaClienteCollection;
    //RELACION CON SEG_SUCURSAL
    @JoinColumn(name = "FID_SEG_SUCURSAL", referencedColumnName = "ID_SUCURSAL")
    @ManyToOne(fetch = FetchType.LAZY)
    private  Sucursal fidSegSucursal;


    public Cuenta() {
    }

    public Cuenta(Long idCuenta) {
        this.idCuenta = idCuenta;
    }

    public Cuenta(Long idCuenta, double montoActual, Date fechaApertura) {
        this.idCuenta = idCuenta;
        this.montoActual = montoActual;
        this.fechaApertura = fechaApertura;
    }

    public Long getIdCuenta() {
        return idCuenta;
    }

    public void setIdCuenta(Long idCuenta) {
        this.idCuenta = idCuenta;
    }

    public double getMontoActual() {
        return montoActual;
    }

    public void setMontoActual(double montoActual) {
        this.montoActual = montoActual;
    }

    public Date getFechaApertura() {
        return fechaApertura;
    }

    public void setFechaApertura(Date fechaApertura) {
        this.fechaApertura = fechaApertura;
    }

    public String getNroCuenta() {
        return nroCuenta;
    }

    public void setNroCuenta(String nroCuenta) {
        this.nroCuenta = nroCuenta;
    }

    public EstadoCuenta getEstadoCuenta() {
        return estadoCuenta;
    }

    public void setEstadoCuenta(EstadoCuenta estadoCuenta) {
        this.estadoCuenta = estadoCuenta;
    }

    public Double getTasaInteresPlazoFijo() {
        return tasaInteresPlazoFijo;
    }

    public void setTasaInteresPlazoFijo(Double tasaInteresPlazoFijo) {
        this.tasaInteresPlazoFijo = tasaInteresPlazoFijo;
    }

    public Integer getDiasPlazoFijo() {
        return diasPlazoFijo;
    }

    public void setDiasPlazoFijo(Integer diasPlazoFijo) {
        this.diasPlazoFijo = diasPlazoFijo;
    }

    public Date getFechaFinPlazoFijo() {
        return fechaFinPlazoFijo;
    }

    public void setFechaFinPlazoFijo(Date fechaFinPlazoFijo) {
        this.fechaFinPlazoFijo = fechaFinPlazoFijo;
    }

    public Double getTasaItf() {
        return tasaItf;
    }

    public void setTasaItf(Double tasaItf) {
        this.tasaItf = tasaItf;
    }

    public TarjetaDebito getFidPltTarjetaDebito() {
        return fidPltTarjetaDebito;
    }

    public void setFidPltTarjetaDebito(TarjetaDebito fidPltTarjetaDebito) {
        this.fidPltTarjetaDebito = fidPltTarjetaDebito;
    }

    public TipoCuenta getFidPltTipoCuenta() {
        return fidPltTipoCuenta;
    }

    public void setFidPltTipoCuenta(TipoCuenta fidPltTipoCuenta) {
        this.fidPltTipoCuenta = fidPltTipoCuenta;
    }

    public List<Chequera> getChequeraCollection() {
        return chequeraCollection;
    }

    public void setChequeraCollection(List<Chequera> chequeraCollection) {
        this.chequeraCollection = chequeraCollection;
    }

    public List<DetalleCuentaCliente> getDetalleCuentaClienteCollection() {
        return detalleCuentaClienteCollection;
    }

    public void setDetalleCuentaClienteCollection(List<DetalleCuentaCliente> detalleCuentaClienteCollection) {
        this.detalleCuentaClienteCollection = detalleCuentaClienteCollection;
    }

    // -------------SUCURSALES
    public Sucursal getFidSegSucursal() {
        return fidSegSucursal;
    }

    public void setFidSegSucursal(Sucursal fidSegSucursal) {
        this.fidSegSucursal = fidSegSucursal;
    }  

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idCuenta != null ? idCuenta.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Cuenta)) {
            return false;
        }
        Cuenta other = (Cuenta) object;
        if ((this.idCuenta == null && other.idCuenta != null) || (this.idCuenta != null && !this.idCuenta.equals(other.idCuenta))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "edu.upn.sigemfi.plt.be.Cuenta[idCuenta=" + idCuenta + "]";
    }

}
